home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5g.s < prev    next >
Text File  |  1994-07-06  |  11KB  |  333 lines

  1.  
  2. ; Lezione5g.s    SCORRIMENTO DI UNA FIGURA IN ALTO E IN BASSO MODIFICANDO I
  3. ;        PUNTATORI AI PITPLANES NELLA COPPERLIST + EFFETTO SPECCHIO
  4. ;        OTTENUTO CON I MODULI NEGATIVI (-40*2, -40*3, -40*4...)
  5.  
  6.     SECTION    CiriCop,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  11.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  14.     move.l    d0,a6
  15.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  16.  
  17. ;     PUNTIAMO I NOSTRI BITPLANES
  18.  
  19.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  20.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  21.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  22. POINTBP:
  23.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  25.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  26.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  28.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  29.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  30. ;
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  34.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  35.  
  36. mouse:
  37.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  38.     bne.s    mouse        ; Se non ancora, non andare avanti
  39.  
  40.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  41.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  42.  
  43.  
  44.     bsr.w    MuoviCopper    ; fa scorrere la figura in alto e in basso
  45.                 ; di una linea alla volta cambiando i
  46.                 ; puntatori ai bitplanes in copperlist
  47.  
  48. Aspetta:
  49.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  50.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  51.  
  52.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  53.     bne.s    mouse        ; se no, torna a mouse:
  54.  
  55.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  56.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  57.  
  58.     move.l    4.w,a6
  59.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  60.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  61.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  62.     rts            ; USCITA DAL PROGRAMMA
  63.  
  64. ;    Dati
  65.  
  66. GfxName:
  67.     dc.b    "graphics.library",0,0    
  68.  
  69. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  70.     dc.l    0    ; della graphics.library
  71.  
  72. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  73.     dc.l    0
  74.  
  75.  
  76. ;    Questa routine sposta la figura in alto e in basso, agendo sui
  77. ;    puntatori ai bitplanes in copperlist (tramite la label BPLPOINTERS)
  78. ;    La struttura e' simile a quella di Lezione3d.s
  79.  
  80. MuoviCopper:
  81.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  82.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  83.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  84.     move.w    6(a1),d0    ; in d0 - il contrario della routine che
  85.                 ; punta i bitplanes! Qua invece di mettere
  86.                 ; l'indirizzo lo prendiamo!!!
  87.  
  88.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  89.                 ; azzerata, (cioe' il TST verifica il BEQ)
  90.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  91.                 ; (se cioe' questo TST non e' verificato)
  92.                 ; continuiamo salendo (facendo dei sub)
  93.     beq.w    VAIGIU
  94.     cmp.l    #PIC-(40*18),d0    ; siamo arrivati abbastanza in BASSO?
  95.     beq.s    MettiGiu    ; se si, siamo in fondo e dobbiamo risalire
  96.     sub.l    #40,d0        ; sottraiamo 40, ossia 1 linea, facendo
  97.                 ; scorrere in BASSO la figura
  98.     bra.s    Finito
  99.  
  100. MettiGiu:
  101.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  102.     bra.s    Finito        ; fara' saltare alla routine VAIGIU
  103.  
  104. VAIGIU:
  105.     cmpi.l    #PIC+(40*130),d0    ; siamo arrivati abbastanza in ALTO?
  106.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  107.     add.l    #40,d0        ; Aggiungiamo 40, ossia 1 linea, facendo
  108.                 ; scorrere in ALTO la figura
  109.     bra.s    finito
  110.  
  111. MettiSu:
  112.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  113.     rts            ; significa che dobbiamo risalire.
  114.  
  115. Finito:                ; PUNTIAMO I PUNTATORI BITPLANES
  116.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  117.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  118. POINTBP2:
  119.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  120.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  121.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  122.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  123.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  124.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  125.     dbra    d1,POINTBP2    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  126.     rts
  127.  
  128.  
  129. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG.
  130.  
  131. SuGiu:
  132.     dc.b    0,0
  133.  
  134.  
  135.     SECTION    GRAPHIC,DATA_C
  136.  
  137. COPPERLIST:
  138.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  139.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  140.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  141.     dc.w    $13e,$0000
  142.  
  143.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  144.     dc.w    $90,$2cc1    ; DiwStop
  145.     dc.w    $92,$0038    ; DdfStart
  146.     dc.w    $94,$00d0    ; DdfStop
  147.     dc.w    $102,0        ; BplCon1
  148.     dc.w    $104,0        ; BplCon2
  149.     dc.w    $108,0        ; Bpl1Mod
  150.     dc.w    $10a,0        ; Bpl2Mod
  151.  
  152.             ; 5432109876543210
  153.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  154.                     ; 3 bitplanes lowres, non lace
  155. BPLPOINTERS:
  156.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  157.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  158.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  159.  
  160.     dc.w    $0180,$000    ; color0
  161.     dc.w    $0182,$475    ; color1
  162.     dc.w    $0184,$fff    ; color2
  163.     dc.w    $0186,$ccc    ; color3
  164.     dc.w    $0188,$999    ; color4
  165.     dc.w    $018a,$232    ; color5
  166.     dc.w    $018c,$777    ; color6
  167.     dc.w    $018e,$444    ; color7
  168.  
  169. ;    EFFETTO SPECCHIO (che si potrebbe vendere per effetto "texturemap")
  170.  
  171.     dc.w    $b007,$fffe
  172.     dc.w    $180,$004    ; Color0
  173.     dc.w    $108,-40*7    ; Bpl1Mod - specchio dimezzato 5 volte
  174.     dc.w    $10a,-40*7    ; Bpl2Mod
  175.     dc.w    $b307,$fffe
  176.     dc.w    $180,$006    ; Color0
  177.     dc.w    $108,-40*6    ; Bpl1Mod - specchio dimezzato 4 volte
  178.     dc.w    $10a,-40*6    ; Bpl2Mod
  179.     dc.w    $b607,$fffe
  180.     dc.w    $180,$008    ; Color0
  181.     dc.w    $108,-40*5    ; Bpl1Mod - specchio dimezzato 3 volte
  182.     dc.w    $10a,-40*5    ; Bpl2Mod
  183.     dc.w    $bb07,$fffe
  184.     dc.w    $180,$00a    ; Color0
  185.     dc.w    $108,-40*4    ; Bpl1Mod - specchio dimezzato 2 volte
  186.     dc.w    $10a,-40*4    ; Bpl2Mod
  187.     dc.w    $c307,$fffe
  188.     dc.w    $180,$00c    ; Color0
  189.     dc.w    $108,-40*3    ; Bpl1Mod - specchio dimezzato
  190.     dc.w    $10a,-40*3    ; Bpl2Mod
  191.     dc.w    $d007,$fffe
  192.     dc.w    $180,$00e    ; Color0
  193.     dc.w    $108,-40*2    ; Bpl1Mod - specchio normale
  194.     dc.w    $10a,-40*2    ; Bpl2Mod
  195.     dc.w    $d607,$fffe
  196.     dc.w    $180,$00f    ; Color0
  197.     dc.w    $108,-40    ; Bpl1Mod - FLOOD, linee ripetute per
  198.     dc.w    $10a,-40    ; Bpl2Mod - effetto centrale di ingrandimento
  199.     dc.w    $da07,$fffe
  200.     dc.w    $180,$00e    ; Color0
  201.     dc.w    $108,-40*2    ; Bpl1Mod - specchio normale
  202.     dc.w    $10a,-40*2    ; Bpl2Mod
  203.     dc.w    $e007,$fffe
  204.     dc.w    $180,$00c    ; Color0
  205.     dc.w    $108,-40*3    ; Bpl1Mod - specchio dimezzato
  206.     dc.w    $10a,-40*3    ; Bpl2Mod
  207.     dc.w    $ed07,$fffe
  208.     dc.w    $180,$00a    ; Color0
  209.     dc.w    $108,-40*4    ; Bpl1Mod - specchio dimezzato 2 volte
  210.     dc.w    $10a,-40*4    ; Bpl2Mod
  211.     dc.w    $f507,$fffe
  212.     dc.w    $180,$008    ; Color0
  213.     dc.w    $108,-40*5    ; Bpl1Mod - specchio dimezzato 3 volte
  214.     dc.w    $10a,-40*5    ; Bpl2Mod
  215.     dc.w    $fa07,$fffe
  216.     dc.w    $180,$006    ; Color0
  217.     dc.w    $108,-40*6    ; Bpl1Mod - specchio dimezzato 4 volte
  218.     dc.w    $10a,-40*6    ; Bpl2Mod
  219.     dc.w    $fd07,$fffe
  220.     dc.w    $180,$004    ; Color0
  221.     dc.w    $108,-40*7    ; Bpl1Mod - specchio dimezzato 5 volte
  222.     dc.w    $10a,-40*7    ; Bpl2Mod
  223.     dc.w    $ff07,$fffe
  224.     dc.w    $180,$002    ; Color0
  225.     dc.w    $108,-40    ; ferma l'immagine per evitare di visualizzare
  226.     dc.w    $10a,-40    ; i byte prima della RAW
  227.  
  228.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  229.  
  230. ;    figura
  231.  
  232.     dcb.b    40*98,0        ; spazio azzerato
  233.  
  234. PIC:
  235.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  236.                     ; convertita col KEFCON, fatta di
  237.                     ; 3 bitplanes consecutivi
  238.  
  239.     dcb.b    40*30,0        ; spazio azzerato
  240.  
  241.     end
  242.  
  243. In questo esempio mettendo dei moduli negativi per creare specchiature sempre
  244. piu' "DIMEZZATE", e' stato possibile simulare "un'avvolgimento" dell'immagine
  245. specchiata su una superficie rozzamente "curva". Disponendo bene i moduli
  246. si possono generare effetti del tipo ZOOM o LENTE DI INGRANDIMENTO, nonche' di
  247. distorsione cilindrica come questo esempio, specialmente se si aiuta l'effetto
  248. ottico con i colori (in questo caso con una tonalita' di blu).
  249. Il sorgente e' lo stesso di Lezione5c.s, l'unica modifica e' nella copperlist.
  250. Per aggiungere realismo all'effetto di "avvolgimento su un cilindro" si
  251. puo' simulare una curvatura con i $dff102 (bplcon1), come gia' visto nel
  252. listato Lezione5d2.s. Sostituite la copperlist dell'esempio con questa, che
  253. e' una fusione con quella di Lezione5d2.s.
  254.  
  255. - Ricordo che per rimuovere la vecchia parte di copperlist potete usare
  256. l'opzione Amiga+b per selezionarla e Amiga+x per il taglio a selezione fatta,
  257. mentre per copiare questa parte di copperlist sopra, selezionatela con Amiga+b,
  258. poi Amiga+c per copiare, posizionatevi nel punto giusto in copperlist e
  259. inseritela con Amiga+i.
  260.  
  261.  
  262.     dc.w    $b007,$fffe
  263.     dc.w    $180,$004    ; Color0
  264.     dc.w    $102,$011    ; bplcon1
  265.     dc.w    $108,-40*7    ; Bpl1Mod - specchio dimezzato 5 volte
  266.     dc.w    $10a,-40*7    ; Bpl2Mod
  267.     dc.w    $b307,$fffe
  268.     dc.w    $180,$006    ; Color0
  269.     dc.w    $102,$022    ; bplcon1
  270.     dc.w    $108,-40*6    ; Bpl1Mod - specchio dimezzato 4 volte
  271.     dc.w    $10a,-40*6    ; Bpl2Mod
  272.     dc.w    $b607,$fffe
  273.     dc.w    $180,$008    ; Color0
  274.     dc.w    $102,$033    ; bplcon1
  275.     dc.w    $108,-40*5    ; Bpl1Mod - specchio dimezzato 3 volte
  276.     dc.w    $10a,-40*5    ; Bpl2Mod
  277.     dc.w    $bb07,$fffe
  278.     dc.w    $180,$00a    ; Color0
  279.     dc.w    $102,$044    ; bplcon1
  280.     dc.w    $108,-40*4    ; Bpl1Mod - specchio dimezzato 2 volte
  281.     dc.w    $10a,-40*4    ; Bpl2Mod
  282.     dc.w    $c307,$fffe
  283.     dc.w    $180,$00c    ; Color0
  284.     dc.w    $102,$055    ; bplcon1
  285.     dc.w    $108,-40*3    ; Bpl1Mod - specchio dimezzato
  286.     dc.w    $10a,-40*3    ; Bpl2Mod
  287.     dc.w    $d007,$fffe
  288.     dc.w    $180,$00e    ; Color0
  289.     dc.w    $102,$066    ; bplcon1
  290.     dc.w    $108,-40*2    ; Bpl1Mod - specchio normale
  291.     dc.w    $10a,-40*2    ; Bpl2Mod
  292.     dc.w    $d607,$fffe
  293.     dc.w    $180,$00f    ; Color0
  294.     dc.w    $102,$077    ; bplcon1
  295.     dc.w    $108,-40    ; Bpl1Mod - FLOOD, linee ripetute per
  296.     dc.w    $10a,-40    ; Bpl2Mod - effetto centrale di ingrandimento
  297.     dc.w    $da07,$fffe
  298.     dc.w    $180,$00e    ; Color0
  299.     dc.w    $102,$066    ; bplcon1
  300.     dc.w    $108,-40*2    ; Bpl1Mod - specchio normale
  301.     dc.w    $10a,-40*2    ; Bpl2Mod
  302.     dc.w    $e007,$fffe
  303.     dc.w    $180,$00c    ; Color0
  304.     dc.w    $102,$055    ; bplcon1
  305.     dc.w    $108,-40*3    ; Bpl1Mod - specchio dimezzato
  306.     dc.w    $10a,-40*3    ; Bpl2Mod
  307.     dc.w    $ed07,$fffe
  308.     dc.w    $180,$00a    ; Color0
  309.     dc.w    $102,$044    ; bplcon1
  310.     dc.w    $108,-40*4    ; Bpl1Mod - specchio dimezzato 2 volte
  311.     dc.w    $10a,-40*4    ; Bpl2Mod
  312.     dc.w    $f507,$fffe
  313.     dc.w    $180,$008    ; Color0
  314.     dc.w    $102,$033    ; bplcon1
  315.     dc.w    $108,-40*5    ; Bpl1Mod - specchio dimezzato 3 volte
  316.     dc.w    $10a,-40*5    ; Bpl2Mod
  317.     dc.w    $fa07,$fffe
  318.     dc.w    $180,$006    ; Color0
  319.     dc.w    $102,$022    ; bplcon1
  320.     dc.w    $108,-40*6    ; Bpl1Mod - specchio dimezzato 4 volte
  321.     dc.w    $10a,-40*6    ; Bpl2Mod
  322.     dc.w    $fd07,$fffe
  323.     dc.w    $180,$004    ; Color0
  324.     dc.w    $102,$011    ; bplcon1
  325.     dc.w    $108,-40*7    ; Bpl1Mod - specchio dimezzato 5 volte
  326.     dc.w    $10a,-40*7    ; Bpl2Mod
  327.     dc.w    $ff07,$fffe
  328.     dc.w    $180,$002    ; Color0
  329.     dc.w    $102,$000    ; bplcon1
  330.     dc.w    $108,-40    ; ferma l'immagine per evitare di visualizzare
  331.     dc.w    $10a,-40    ; i byte prima della RAW
  332.  
  333.